package com.atguigu.gmall.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;

import java.sql.Connection;
import java.util.List;

/**
 * @Author lizhenchao@atguigu.cn
 * @Date 2021/8/27 16:04
 */
public class DimUtil {
    // 从Phoenix获取维度数据
    public static JSONObject getDimFromPhoenix(Connection phoenixConn, String tableName, Object id) {
        
        // select * from dim_user_info where id = ?
        String sql = "select * from " + tableName + " where id = ?";
        Object[] args = {id.toString()};
        List<JSONObject> list = JdbcUtil.queryList(phoenixConn, sql, args, JSONObject.class);
        return list.size() == 0 ? new JSONObject() : list.get(0);
    }
    
    // 获取维度数据
    public static JSONObject getDim(Connection conn, Jedis redis, String tableName, Long id) {
        
        // 1. 先去redis获取维度数据
        JSONObject dim = getDimFromRedis(redis, tableName, id);
        if (dim == null) {
            System.out.println("走数据库:" + tableName + "  " + id);
            // 2. 如果redis没有, 再去Phoenix获取
            dim = getDimFromPhoenix(conn, tableName, id);
            // 3. 把维度数据存入到redis
            saveDimToRedis(redis, tableName, id, dim);
        } else {
            System.out.println("走缓存:" + tableName + "  " + id);
        }
        return dim;
    }
    
    // 存入指定的维度数据到Redis
    private static void saveDimToRedis(Jedis redis, String tableName, Long id, JSONObject dim) {
        String key = tableName + ":" + id;
        String value = dim.toJSONString();
        /*redis.set(key, value);
        redis.expire(key, 24 * 60 * 60);*/
        redis.setex(key, 24 * 60 * 60, value);
    }
    
    // 从redis获取维度数据 TODO
    private static JSONObject getDimFromRedis(Jedis redis, String tableName, Long id) {
        String key = tableName + ":" + id;
        String value = redis.get(key);
        if (value != null) {
            redis.expire(key, 24 * 60 * 60);  // 一旦某个key被查到, 则应该更新过期时间
            return JSON.parseObject(value);
        }
        return null;
    }
    
}
/*
如何设计数据结构:
string list set hash zset

string:
    key                 value
    tableName:id        json个数的数据
    
    缺点:
        key过多
        
        单独设定一个库来存储维度数据
        
        
    优点:
        可以单独为每条设计过期时间
    
list:
    key         value
    tableName   多个json数据
set: 排除

hash
    key                 field         value
    tableName           id            json字符串
    
    user_info
    没有办法为每条数据单独设置过期时间
    

 */
